11-12. 構造体そのものを引き渡し
◇構造体そのものを引き渡し
前回のプログラムを改造してみました。ちなみに、構造体の宣言はmain()内でなく、グローバル領域に移しています。それはoutput()のプロトタイプ宣言で構造体st_sampが宣言されているためでもあります(^^;;;
#include<stdio.h> struct st_samp{ int x; int y; int z; }; int output(struct st_samp s2); main() { struct st_samp s1={2,3,0}; s1.z = output(s1); printf("%d * %d = %d\n",s1.x,s1.y,s1.z); return; } int output(struct st_samp s2) { s2.z = s2.x * s2.y; return s2.z; } /* 結果 2 * 3 = 6 */
結果は前回と同じです。
main() output()
s1 s2
┌────┐ ┌────┐
│s1.x ├──→│s1.x │
├────┤ ├────┤
│s1.y ├──→│s2.y │
├────┤ ├────┤
│s1.z ├──→│s2.z │
└────┘ └─┬──┘
↑ │s2.z = s2.x * s2.y
└───────┘
return s2.z
メモリブロックではこのようになります。
構造体ごと引き渡す利点は、引数が単純に記述できプログラムが見やすくなりますが、構造体が大きくなるにつれて、無駄なオーバーヘッドやメモリ消費を招きます。